@@ -374,6 +374,10 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 374 | 374 | 
                }  | 
            
| 375 | 375 | 
                 | 
            
| 376 | 376 | 
                def brandata(self, brand_id=None):  | 
            
| 377 | 
                + if self.unionid:  | 
            |
| 378 | 
                + saleclerk = SaleclerkInfo.objects.filter(brand_id=brand_id, unionid=self.unionid, status=True).exists()  | 
            |
| 379 | 
                + else:  | 
            |
| 380 | 
                + saleclerk = False  | 
            |
| 377 | 381 | 
                         return {
               | 
            
| 378 | 382 | 
                'user_id': self.user_id,  | 
            
| 379 | 383 | 
                'name': self.name,  | 
            
                @@ -383,7 +387,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 383 | 387 | 
                'phone': self.phone,  | 
            
| 384 | 388 | 
                # TODO: Diff for Brands  | 
            
| 385 | 389 | 
                'has_membercard': self.has_membercard,  | 
            
| 386 | 
                - 'saleclerk': SaleclerkInfo.objects.filter(brand_id=brand_id, unionid=self.unionid, status=True).exists(),  | 
            |
| 390 | 
                + 'saleclerk': saleclerk,  | 
            |
| 387 | 391 | 
                }  | 
            
| 388 | 392 | 
                 | 
            
| 389 | 393 | 
                 | 
            
                @@ -180,6 +180,8 @@ urlpatterns += [  | 
            ||
| 180 | 180 | 
                # Mini App  | 
            
| 181 | 181 | 
                urlpatterns += [  | 
            
| 182 | 182 | 
                url(r'^mini/userinfo$', mini_views.get_userinfo_api, name='get_userinfo_api'), # 获取用户信息  | 
            
| 183 | 
                + url(r'^mini/login$', mini_views.mini_login_api, name='mini_login_api'), # 小程序登录  | 
            |
| 184 | 
                + url(r'^mini/userinfo2$', mini_views.get_userinfo_api2, name='get_userinfo_api2'), # 获取用户信息  | 
            |
| 183 | 185 | 
                ]  | 
            
| 184 | 186 | 
                 | 
            
| 185 | 187 | 
                urlpatterns += [  | 
            
                @@ -7,13 +7,13 @@ from django_logit import logit  | 
            ||
| 7 | 7 | 
                from django_response import response  | 
            
| 8 | 8 | 
                from ipaddr import client_ip  | 
            
| 9 | 9 | 
                from pywe_membercard import get_miniapp_extraData  | 
            
| 10 | 
                -from pywe_miniapp import get_session_key, get_userinfo, store_session_key  | 
            |
| 10 | 
                +from pywe_miniapp import get_session_info, get_session_key, get_userinfo, store_session_key  | 
            |
| 11 | 11 | 
                from pywe_storage import RedisStorage  | 
            
| 12 | 12 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 13 | 13 | 
                 | 
            
| 14 | 14 | 
                from account.models import UserInfo  | 
            
| 15 | 15 | 
                from statistic.models import RegisterStatisticInfo  | 
            
| 16 | 
                -from utils.error.errno_utils import ProductBrandStatusCode  | 
            |
| 16 | 
                +from utils.error.errno_utils import ProductBrandStatusCode, UserStatusCode  | 
            |
| 17 | 17 | 
                from utils.redis.connect import r  | 
            
| 18 | 18 | 
                from utils.redis.rprofile import set_profile_info  | 
            
| 19 | 19 | 
                 | 
            
                @@ -83,6 +83,75 @@ def get_userinfo_api(request):  | 
            ||
| 83 | 83 | 
                 | 
            
| 84 | 84 | 
                # Store Userinfo  | 
            
| 85 | 85 | 
                set_profile_info(user)  | 
            
| 86 | 
                +  | 
            |
| 87 | 
                + # Store SessionKey  | 
            |
| 88 | 
                + store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r))  | 
            |
| 89 | 
                +  | 
            |
| 90 | 
                + return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id))  | 
            |
| 91 | 
                +  | 
            |
| 92 | 
                +  | 
            |
| 93 | 
                +@logit  | 
            |
| 94 | 
                +@transaction.atomic  | 
            |
| 95 | 
                +def mini_login_api(request):  | 
            |
| 96 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 97 | 
                +  | 
            |
| 98 | 
                + if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            |
| 99 | 
                + return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            |
| 100 | 
                +  | 
            |
| 101 | 
                +    wxcfg = WECHAT.get('MINIAPP', {})
               | 
            |
| 102 | 
                +  | 
            |
| 103 | 
                +    appid = wxcfg.get('appID')
               | 
            |
| 104 | 
                +    secret = wxcfg.get('appsecret')
               | 
            |
| 105 | 
                +  | 
            |
| 106 | 
                +    code = request.POST.get('code', '')
               | 
            |
| 107 | 
                +  | 
            |
| 108 | 
                + # // 正常返回的JSON数据包  | 
            |
| 109 | 
                +    # {
               | 
            |
| 110 | 
                + # "openid": "OPENID",  | 
            |
| 111 | 
                + # "session_key": "SESSIONKEY",  | 
            |
| 112 | 
                + # }  | 
            |
| 113 | 
                + #  | 
            |
| 114 | 
                + # // 满足UnionID返回条件时,返回的JSON数据包  | 
            |
| 115 | 
                +    # {
               | 
            |
| 116 | 
                + # "openid": "OPENID",  | 
            |
| 117 | 
                + # "session_key": "SESSIONKEY",  | 
            |
| 118 | 
                + # "unionid": "UNIONID"  | 
            |
| 119 | 
                + # }  | 
            |
| 120 | 
                + # // 错误时返回JSON数据包(示例为Code无效)  | 
            |
| 121 | 
                +    # {
               | 
            |
| 122 | 
                + # "errcode": 40029,  | 
            |
| 123 | 
                + # "errmsg": "invalid code"  | 
            |
| 124 | 
                + # }  | 
            |
| 125 | 
                + session_info = get_session_info(appid=appid, secret=secret, code=code)  | 
            |
| 126 | 
                +    session_key = session_info.get('session_key', '')
               | 
            |
| 127 | 
                +    unionid = session_info.get('unionid', '')
               | 
            |
| 128 | 
                +    openid = session_info.get('openid', '')
               | 
            |
| 129 | 
                +  | 
            |
| 130 | 
                + # Get or Create User  | 
            |
| 131 | 
                + user, created = UserInfo.objects.select_for_update().get_or_create(openid_miniapp=openid)  | 
            |
| 132 | 
                +  | 
            |
| 133 | 
                + # Set User_id  | 
            |
| 134 | 
                + if created:  | 
            |
| 135 | 
                + user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')  | 
            |
| 136 | 
                + # 注册用户统计  | 
            |
| 137 | 
                + rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create(  | 
            |
| 138 | 
                + brand_id=brand_id,  | 
            |
| 139 | 
                + ymd=int(tc.local_string(format='%Y%m%d')),  | 
            |
| 140 | 
                + )  | 
            |
| 141 | 
                + rsi.num += 1  | 
            |
| 142 | 
                + rsi.save()  | 
            |
| 143 | 
                +  | 
            |
| 144 | 
                + # Set User Key's Value  | 
            |
| 145 | 
                + user.user_from = UserInfo.MINIAPP_USER  | 
            |
| 146 | 
                + user.unionid = unionid  | 
            |
| 147 | 
                + user.user_status = UserInfo.ACTIVATED  | 
            |
| 148 | 
                + user.signup_ip = client_ip(request)  | 
            |
| 149 | 
                + user.signup_at = tc.utc_datetime()  | 
            |
| 150 | 
                + user.save()  | 
            |
| 151 | 
                +  | 
            |
| 152 | 
                + # Store Userinfo  | 
            |
| 153 | 
                + set_profile_info(user)  | 
            |
| 154 | 
                +  | 
            |
| 86 | 155 | 
                # Store SessionKey  | 
            
| 87 | 156 | 
                store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r))  | 
            
| 88 | 157 | 
                 | 
            
                @@ -91,6 +160,60 @@ def get_userinfo_api(request):  | 
            ||
| 91 | 160 | 
                 | 
            
| 92 | 161 | 
                @logit  | 
            
| 93 | 162 | 
                @transaction.atomic  | 
            
| 163 | 
                +def get_userinfo_api2(request):  | 
            |
| 164 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 165 | 
                +    user_id = request.POST.get('user_id', '')
               | 
            |
| 166 | 
                +  | 
            |
| 167 | 
                + if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            |
| 168 | 
                + return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            |
| 169 | 
                +  | 
            |
| 170 | 
                +    wxcfg = WECHAT.get('MINIAPP', {})
               | 
            |
| 171 | 
                +  | 
            |
| 172 | 
                +    appid = wxcfg.get('appID')
               | 
            |
| 173 | 
                +    secret = wxcfg.get('appsecret')
               | 
            |
| 174 | 
                +  | 
            |
| 175 | 
                +    code = request.POST.get('code', '')
               | 
            |
| 176 | 
                +    encryptedData = request.POST.get('encryptedData', '')
               | 
            |
| 177 | 
                +    iv = request.POST.get('iv', '')
               | 
            |
| 178 | 
                +  | 
            |
| 179 | 
                + try:  | 
            |
| 180 | 
                + user = UserInfo.objects.get(user_id=user_id, status=True)  | 
            |
| 181 | 
                + except UserInfo.DoesNotExist:  | 
            |
| 182 | 
                + return response(UserStatusCode.USER_NOT_FOUND)  | 
            |
| 183 | 
                +  | 
            |
| 184 | 
                +    # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
               | 
            |
| 185 | 
                + # u'city': u'Guangzhou',  | 
            |
| 186 | 
                + # u'country': u'CN',  | 
            |
| 187 | 
                + # u'gender': 1,  | 
            |
| 188 | 
                + # u'language': u'zh_CN',  | 
            |
| 189 | 
                + # u'nickName': u'Band',  | 
            |
| 190 | 
                + # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',  | 
            |
| 191 | 
                + # u'province': u'Guangdong',  | 
            |
| 192 | 
                + # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',  | 
            |
| 193 | 
                +    #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
               | 
            |
| 194 | 
                + session_key = get_session_key(appid=appid, secret=secret, code=code, unid=user_id, storage=RedisStorage(r))  | 
            |
| 195 | 
                + # Get Userinfo  | 
            |
| 196 | 
                + userinfo = get_userinfo(appid=appid, secret=secret, code=code, session_key=session_key, encryptedData=encryptedData, iv=iv)  | 
            |
| 197 | 
                +  | 
            |
| 198 | 
                + # Set User Key's Value  | 
            |
| 199 | 
                +    user.unionid = userinfo.get('unionId', '')
               | 
            |
| 200 | 
                +    user.openid_miniapp = userinfo.get('openId', '')
               | 
            |
| 201 | 
                +    user.sex = userinfo.get('gender', '')
               | 
            |
| 202 | 
                +    user.nickname = userinfo.get('nickName', '')
               | 
            |
| 203 | 
                +    user.avatar = userinfo.get('avatarUrl', '')
               | 
            |
| 204 | 
                +    user.country = userinfo.get('country', '')
               | 
            |
| 205 | 
                +    user.province = userinfo.get('province', '')
               | 
            |
| 206 | 
                +    user.city = userinfo.get('city', '')
               | 
            |
| 207 | 
                + user.save()  | 
            |
| 208 | 
                +  | 
            |
| 209 | 
                + # Store Userinfo  | 
            |
| 210 | 
                + set_profile_info(user)  | 
            |
| 211 | 
                +  | 
            |
| 212 | 
                + return response(200, 'Mini App Get Userinfo Success', u'微信小程序获取用户信息成功', user.brandata(brand_id=brand_id))  | 
            |
| 213 | 
                +  | 
            |
| 214 | 
                +  | 
            |
| 215 | 
                +@logit  | 
            |
| 216 | 
                +@transaction.atomic  | 
            |
| 94 | 217 | 
                def membercard_extradata(request):  | 
            
| 95 | 218 | 
                     wxcfg = WECHAT.get('JSAPI', {})
               | 
            
| 96 | 219 | 
                 | 
            
                @@ -1,6 +1,6 @@  | 
            ||
| 1 | 1 | 
                pywe-jssdk==1.1.0  | 
            
| 2 | 2 | 
                pywe-membercard==1.0.0  | 
            
| 3 | 
                -pywe-miniapp==1.1.3  | 
            |
| 3 | 
                +pywe-miniapp==1.1.4  | 
            |
| 4 | 4 | 
                pywe-oauth==1.0.6  | 
            
| 5 | 5 | 
                pywe-pay==1.0.12  | 
            
| 6 | 6 | 
                pywe-pay-notify==1.0.4  |